package org.htw.osgi.interceptor.texter;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import org.htw.osgi.renderservice.*;
import org.htw.osgi.renderservice.essentials.*;
import javax.servlet.*;

/**
 * <p>Implementierung eines Interceptors der den Parameter
 * "message" mit der Größe "fontsize" mittig auf das Ergebnis-Image 
 * zeichnet.</p>
 * 
 * @author  Benjamin Friedrich (<a href="mailto:benjamin_friedrich@gmx.de">mailto:benjamin_friedrich@gmx.de</a>)
 * @version 1.0  Juni 2009
 */
public final class Activator 
extends            ARenderActivator
{
	private final static int    PRIORITY         = 200;
	private final static int    DEF_WIDTH        = 100;
	private final static int    DEF_HEIGHT       = 100;
	private final static String PARAM_MESSAGE    = "message";
	private final static String PARAM_WIDTH      = "width";
	private final static String PARAM_HEIGHT     = "height";
	private final static String PARAM_FONT_SIZE  = "fontsize";
	private final static String SERVICE_NAME     = "org.htw.osgi.interceptor.texter";
	
	/**
	 * Konstruktor von Activation des Interceptors
	 * org.htw.osgi.interceptor.texter
	 */
	public Activator() 
	{
		super(PRIORITY);
	}

	/*
	 * (non-Javadoc)
	 * @see org.htw.osgi.renderservice.essentials.IInterceptor#processRequest(javax.servlet.ServletRequest)
	 */
	@Override
	public void processRequest(ServletRequest request) 
	{
		// Prüft, ob Ereignis interessant
		if(request instanceof RenderServiceContext)
		{
			final IRenderServiceContext context = (IRenderServiceContext) request;
			
			String message = request.getParameter(PARAM_MESSAGE);

			// Check, ob benötigter Paramerter 'message' gesetzt ist
			if(message == null || message.isEmpty())
			{
				// Benachrichtigt Framework über Fehler
				final IServiceFramework service = context.getRenderService();
				service.signalError("texter: Parameter 'message' muss angegeben sein!");
				return;
			}
			
			message                   = message.trim();
			final Graphics2D g        = context.getGraphics();
			final String     width    = context.getParameter(PARAM_WIDTH);
			final String     height   = context.getParameter(PARAM_HEIGHT);
			final String     fontSize = request.getParameter(PARAM_FONT_SIZE);
			final Font       bakFont  = g.getFont();
			final Color      bakColor = g.getColor();
			
			// Setzt Schrift auf die Größe, die im Parameter "fonsize" angegeben wurde
			if(fontSize != null)
			{
				g.setFont(new Font(bakFont.getFontName(), 
						           bakFont.getStyle(), 
						           Integer.parseInt(fontSize)) );
			}
			
			// Berechnung des Textposition
			Integer           intWidth  = (width  != null ? Integer.parseInt(width)  : DEF_WIDTH);
		    Integer           intHeight = (height != null ? Integer.parseInt(height) : DEF_HEIGHT);
			final Rectangle2D strBounds = g.getFontMetrics().getStringBounds(message, g);

			intWidth  -= strBounds.getWidth();
			intHeight -= strBounds.getHeight();
			
			// Rendern des Textes
			g.setColor(Color.BLACK);
			g.drawString(message, 
						 intWidth  / 2, 
						 intHeight / 2);
			
			
			// Rücksetzen der ursprünglichen Grpahics-Einstellungen
			g.setColor(bakColor);
			g.setFont(bakFont);
		}
	}
	
	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString()
	{
		return SERVICE_NAME;
	}
}